package com.cs.beneficios.business.entity;

import com.cs.beneficios.business.model.AreaVO;
//import com.cs.beneficios.business.model.RepAtributoVO;
//import com.cs.beneficios.business.model.RepBeneficioOtorgadoVO;

//import com.cs.beneficios.business.model.ReportComunaVO;
//import com.cs.beneficios.business.model.ReporteTotalBeneficiosOtorVO;
//import com.cs.beneficios.business.model.ReporteTotalComunaVO;
import com.cs.beneficios.business.model.ReporteTotalProgramasVO;
//import com.cs.beneficios.business.model.VflexVO;
import com.cs.beneficios.common.ConnectionFactory;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.Collection;
//import java.util.LinkedList;
//import java.util.List;

public class ReporteTotalProgramasDAO
{
  /**
  * Conexion a la base de datos.
  */
  private Connection conn = null;
  private ConnectionFactory cf;
  
  /**
   * Constructor que inicializa la conexion con la base de datos.
   * @param conn Conexion con la base de datos.
   */
   
  public ReporteTotalProgramasDAO(ConnectionFactory cf)
  {
    this.cf = cf;
    try{
      this.conn = this.cf.getConnection();
    }catch(SQLException e){}
  }
  
  public Collection GetTotalProgSubpro(ReporteTotalProgramasVO criterea)throws SQLException
  {
     String query = "";
     String query2 = "";
     if((Object)criterea.getDesde() != "" && (Object)criterea.getHasta() != "")
     {
       query = "SELECT prog.NOMBRE nombre_programa, sub.NOMBRE nombre_subprograma, "+
               "Fcs_Ben_Cantidad_Beneficios(sub.CODIGO,'"+criterea.getDesde()+"','"+criterea.getHasta()+"') cantidad_beneficios, "+
               "Fcs_Ben_ValorTotal_Beneficios(sub.CODIGO,'"+criterea.getDesde()+"','"+criterea.getHasta()+"') valor_beneficios, "+
               "Fcs_Ben_Cantidad_Beneficiarios(sub.CODIGO,'"+criterea.getDesde()+"','"+criterea.getHasta()+"') cantidad_beneficiarios, "+
               "subarea.NOMBRE nombre_subarea, area.NOMBRE nombre_area, "+
               "fcs_ben_subtotal_programa(prog.CODIGO," + criterea.getCodeSubprograma() + ") subtotal, "+
               "fcs_ben_cantidad_subtotal(prog.CODIGO," + criterea.getCodeSubprograma() + ",'"+criterea.getDesde()+"','"+criterea.getHasta()+"') cantidad_subtotal, "+
               "NVL(fcs_ben_valor_subtotal(prog.CODIGO," + criterea.getCodeSubprograma() + ",'"+criterea.getDesde()+"','"+criterea.getHasta()+"'),0) valor_subtotal "+
               "FROM TCS_BEN_AREA area,	TCS_BEN_AREA subarea, TCS_BEN_PROGRAMA prog, TCS_BEN_SUBPROGRAMA sub "+
               "WHERE area.CODIGO = prog.AREA_CODIGO "+
               "AND subarea.CODIGO = sub.AREA_CODIGO "+
               "AND prog.CODIGO = sub.PRG_CODIGO AND prog.vigencia='A' and sub.vigencia='A' ";
     }else
     {
       query = "SELECT prog.NOMBRE nombre_programa, sub.NOMBRE nombre_subprograma, "+
               "Fcs_Ben_Cantidad_Beneficios(sub.CODIGO,null,null) cantidad_beneficios, Fcs_Ben_ValorTotal_Beneficios(sub.CODIGO,null,null) valor_beneficios, "+
               "Fcs_Ben_Cantidad_Beneficiarios(sub.CODIGO,null,null) cantidad_beneficiarios, subarea.NOMBRE nombre_subarea, area.NOMBRE nombre_area, "+
               "fcs_ben_subtotal_programa(prog.CODIGO," + criterea.getCodeSubprograma() + ") subtotal, fcs_ben_cantidad_subtotal(prog.CODIGO," + criterea.getCodeSubprograma() + ",null,null) cantidad_subtotal, "+
               "NVL(fcs_ben_valor_subtotal(prog.CODIGO," + criterea.getCodeSubprograma() + ",null,null),0) valor_subtotal "+
               "FROM TCS_BEN_AREA area,	TCS_BEN_AREA subarea, TCS_BEN_PROGRAMA prog, TCS_BEN_SUBPROGRAMA sub "+
               "WHERE area.CODIGO = prog.AREA_CODIGO "+
               "AND subarea.CODIGO = sub.AREA_CODIGO "+
               "AND prog.CODIGO = sub.PRG_CODIGO AND prog.vigencia='A' and sub.vigencia='A' ";
     }  
     
    query2 = "SELECT COUNT(DISTINCT bot.ben_codigo) cantidad_total_beneficiarios\n" + 
            "FROM tcs_ben_beneficio_otorgado bot, tcs_ben_subprograma sub, \n" + 
            "tcs_ben_programa prog, tcs_ben_area area\n" + 
            "WHERE bot.sbpr_codigo = sub.codigo\n" + 
            "AND sub.prg_codigo = prog.codigo\n" + 
            "AND prog.area_codigo = area.codigo\n" + 
            "AND prog.vigencia='A' AND sub.vigencia='A'";
                    
    if((Object)criterea.getCodeArea() != null)
    {
      query += " and area.CODIGO = "+criterea.getCodeArea();
      query2 += " and area.CODIGO = "+criterea.getCodeArea();
    }
    if((Object)criterea.getCodeSubprograma() != null)
    {
      query += " and sub.CODIGO = "+criterea.getCodeSubprograma();
      query2 += " and sub.CODIGO = "+criterea.getCodeSubprograma();
    }
    if((Object)criterea.getCodePrograma() != null)
    {
      query += " and prog.CODIGO = "+criterea.getCodePrograma();
      query2 += " and prog.CODIGO = "+criterea.getCodePrograma();
    }
    if((Object)criterea.getDesde() != "" && (Object)criterea.getHasta() != ""){
        query2 += " and bot.FECHA_BENEFICIO between to_date('"+criterea.getDesde()+"','dd/mm/yyyy') and to_date('"+criterea.getHasta()+"','dd/mm/yyyy')";
    }
    /*
    if((Object)criterea.getDesde() != "" && (Object)criterea.getHasta() != "")
    {
      query += " and prog.desde_vigencia >= to_date('"+criterea.getDesde()+"','dd/mm/rrrr') and prog.hasta_vigencia <= TO_DATE('"+criterea.getHasta()+"','dd/mm/rrrr')";
    }
    
    if((Object)criterea.getDesde() != "" && (Object)criterea.getHasta() == "")
    {
      query += " and prog.desde_vigencia >= TO_DATE('"+criterea.getDesde()+"','dd/mm/rrrr')";
    }
    if((Object)criterea.getDesde() == "" && (Object)criterea.getHasta() != "")
    {
      query += " and prog.hasta_vigencia <= TO_DATE('"+criterea.getHasta()+"','dd/mm/rrrr')";
    }*/
   
    query += " ORDER BY area.NOMBRE, prog.NOMBRE";
    //System.out.println(query);
    
    ResultSet rst = null;
    ResultSet rst2 = null;
    ArrayList lTotalProg = new ArrayList();
    rst = cf.getRecordsRset(query,null,conn);
    rst2 = cf.getRecordsRset(query2, null, conn);
    ReporteTotalProgramasVO objprogramas = null;
    
    String subtotal = null;
    String cantidad_subtotal = null;
    String valor_subtotal = null;
    String strProg = null;
    
    long totalProgramas = 0;
    long totalSubprogramas = 0;
    long cantidad_total = 0;
    long valor_total = 0;

    boolean bContinue = false;
    if(rst.next())
    {
      strProg = rst.getString("nombre_programa");
      totalProgramas += 1;
      
      totalSubprogramas += 1;
      cantidad_total += rst.getLong("cantidad_beneficios");
      valor_total += rst.getLong("valor_beneficios");
      
    
      objprogramas = new ReporteTotalProgramasVO();
      objprogramas.setNombrePrograma(rst.getString("nombre_programa"));
      objprogramas.setNombreSubprograma(rst.getString("nombre_subprograma"));
      objprogramas.setCantidadBeneficiarios(rst.getString("cantidad_beneficiarios"));
      objprogramas.setCantidadBeneficios(new Long(rst.getString("cantidad_beneficios")));
      objprogramas.setValorBeneficios(new Long(rst.getString("valor_beneficios")));
      objprogramas.setNombreSubarea(rst.getString("nombre_subarea"));
      objprogramas.setNombreArea(rst.getString("nombre_area"));
      subtotal = rst.getString("subtotal");
      cantidad_subtotal = rst.getString("cantidad_subtotal");
      valor_subtotal = rst.getString("valor_subtotal");
      
      bContinue = rst.next();
      
      if((bContinue && !rst.getString("nombre_programa").equals(strProg)) || !bContinue)
      {
        if(bContinue)
        {
          strProg = rst.getString("nombre_programa");
          totalProgramas += 1;
        }
        lTotalProg.add(objprogramas);
        objprogramas=null;
        
        objprogramas = new ReporteTotalProgramasVO();
        objprogramas.setNombrePrograma("");
        objprogramas.setNombreSubprograma(subtotal.toString());
        objprogramas.setCantidadBeneficios(new Long(cantidad_subtotal));
        objprogramas.setValorBeneficios(new Long(valor_subtotal));
        objprogramas.setNombreSubarea("");
        objprogramas.setNombreArea("SUBTOTAL:");
      }
      
      lTotalProg.add(objprogramas);
          
      objprogramas=null;
    }
    
    while ( bContinue ) 
		{
      totalSubprogramas += 1;
      cantidad_total += rst.getLong("cantidad_beneficios");
      valor_total += rst.getLong("valor_beneficios");
      
      objprogramas = new ReporteTotalProgramasVO();
      objprogramas.setNombrePrograma(rst.getString("nombre_programa"));
      objprogramas.setNombreSubprograma(rst.getString("nombre_subprograma"));
      objprogramas.setCantidadBeneficiarios(rst.getString("cantidad_beneficiarios"));
      objprogramas.setCantidadBeneficios(new Long(rst.getString("cantidad_beneficios")));
      objprogramas.setValorBeneficios(new Long(rst.getString("valor_beneficios")));
      objprogramas.setNombreSubarea(rst.getString("nombre_subarea"));
      objprogramas.setNombreArea(rst.getString("nombre_area"));
      subtotal = rst.getString("subtotal");
      cantidad_subtotal = rst.getString("cantidad_subtotal");
      valor_subtotal = rst.getString("valor_subtotal");
      
      bContinue = rst.next();
      
      if((bContinue && !rst.getString("nombre_programa").equals(strProg)) || !bContinue)
      {
        if(bContinue)
        {
          strProg = rst.getString("nombre_programa");
          totalProgramas += 1;
        } 
        lTotalProg.add(objprogramas);
        objprogramas=null;
        
        objprogramas = new ReporteTotalProgramasVO();
        objprogramas.setNombrePrograma("");
        objprogramas.setNombreSubprograma(subtotal.toString());
        objprogramas.setCantidadBeneficios(new Long(cantidad_subtotal));
        objprogramas.setValorBeneficios(new Long(valor_subtotal));
        objprogramas.setNombreSubarea("");
        objprogramas.setNombreArea("SUBTOTAL:");
      }
      
      lTotalProg.add(objprogramas);
      objprogramas=null; 
    }
    objprogramas = new ReporteTotalProgramasVO();
    objprogramas.setNombrePrograma(cantidad_total + "");
    objprogramas.setNombreSubprograma("PROGRAMAS:");
    objprogramas.setCantidadBeneficiarios(new Long(totalProgramas).toString());
    objprogramas.setValorBeneficios("");
    objprogramas.setNombreSubarea("Beneficios Otorgados:");
    objprogramas.setNombreArea("TOTAL:");
    
    lTotalProg.add(objprogramas);
    objprogramas=null; 
    
    objprogramas = new ReporteTotalProgramasVO();
    objprogramas.setNombrePrograma(valor_total + "");
    objprogramas.setNombreSubprograma("SUBPROGRAMAS:");
    objprogramas.setCantidadBeneficiarios(new Long(totalSubprogramas).toString());
    objprogramas.setValorBeneficios("");
    objprogramas.setNombreSubarea("Valor Beneficios Otorgados:");
    objprogramas.setNombreArea("");
    
    lTotalProg.add(objprogramas);
    objprogramas=null;
    
    objprogramas = new ReporteTotalProgramasVO();
    rst2.next();
    objprogramas.setNombrePrograma(rst2.getString("cantidad_total_beneficiarios"));
    objprogramas.setCantidadBeneficiarios("");
    objprogramas.setValorBeneficios("");
    objprogramas.setNombreSubarea("Beneficiarios:");
    objprogramas.setNombreArea("");
    
    lTotalProg.add(objprogramas);
    objprogramas=null;
    
    rst.close();
    rst2.close();
    conn.close();
    return lTotalProg;
  }
  
  public Collection GetSecretarias()throws SQLException
  {
    String query = "SELECT NOMBRE, CODIGO FROM TCS_BEN_AREA "+
                    "WHERE AREA_CODIGO IS NULL";
     
    ResultSet rst = null;
    ArrayList lareas = new ArrayList();
    rst = cf.getRecordsRset(query,null,conn);
    AreaVO objarea = null;
   
    while ( rst.next() ) 
		{
        objarea = new AreaVO();
        objarea.setCode(new Long(rst.getString("CODIGO")));
        objarea.setNombre(rst.getString("NOMBRE"));
        lareas.add(objarea);
        objarea=null;
    }
    
    rst.close();
    return lareas;
  }
  
  /************************************************
   * Metodo para provisional para recuprar los filtros utilizados en el reporte
   * *********************************************/
   public ReporteTotalProgramasVO getFilters(ReporteTotalProgramasVO objRtpVO)throws SQLException
   {
     String strQuery = null;
     ResultSet rst = null;
     
     if(objRtpVO.getCodeArea() != null)
     {
       strQuery = "SELECT NOMBRE" +
                  " FROM TCS_BEN_AREA" +
                  " WHERE CODIGO = " + objRtpVO.getCodeArea();
       rst = cf.getRecordsRset(strQuery,null,conn);
       rst.next();
       
       objRtpVO.setNombreArea(rst.getString("NOMBRE"));
     }
     if(objRtpVO.getCodePrograma() != null)
     {
       strQuery = "SELECT NOMBRE" +
                  " FROM TCS_BEN_PROGRAMA" +
                  " WHERE CODIGO = " + objRtpVO.getCodePrograma();
       rst = cf.getRecordsRset(strQuery,null,conn);
       rst.next();
       
       objRtpVO.setNombrePrograma(rst.getString("NOMBRE"));
     }
     if(objRtpVO.getCodeSubprograma() != null)
     {
       strQuery = "SELECT NOMBRE" +
                  " FROM TCS_BEN_SUBPROGRAMA" +
                  " WHERE CODIGO = " + objRtpVO.getCodeSubprograma();
       rst = cf.getRecordsRset(strQuery,null,conn);
       rst.next();
       
       objRtpVO.setNombreSubprograma(rst.getString("NOMBRE"));
     }
     if(rst != null)
       rst.close();
       
     return objRtpVO;
   }
  
  public Connection getConn()
  {
    return conn;
  }
}